// 封装response, 以状态码响应
package response

import (
	"go-mp-starter/global"
	"net/http"
	"os"

	"github.com/gin-gonic/gin"
)

type Response struct {
	ErrorCode int         `json:"error_code"` // 自定义错误码
	Data      interface{} `json:"data"`       // 响应数据
	Message   string      `json:"message"`
}

// Success 成功的响应
func Success(ctx *gin.Context, data interface{}) {
	ctx.JSON(http.StatusOK, Response{
		0,
		data,
		"ok",
	})
}

// Fail 业务失败的响应 ErrorCode不为0
func Fail(ctx *gin.Context, errCode int, msg string) {
	ctx.JSON(http.StatusOK, Response{
		errCode,
		nil,
		msg,
	})
}

// FailByError 失败响应, 返回自定义错误码和消息
func FailByError(ctx *gin.Context, err global.CustomError) {
	Fail(ctx, err.ErrorCode, err.ErrorMsg)
}

// ValidateFail 请求参数验证失败
func ValidateFail(ctx *gin.Context, msg string) {
	Fail(ctx, global.Errors.ValidateError.ErrorCode, msg)
}

// BusinessFail 业务逻辑失败
func BusinessFail(ctx *gin.Context, msg string) {
	Fail(ctx, global.Errors.BusinessError.ErrorCode, msg)
}

// TokenFail token鉴权失败
func TokenFail(ctx *gin.Context) {
	FailByError(ctx, global.Errors.TokenError)
}

// ServerError RecoveryFunc
func ServerError(ctx *gin.Context, err interface{}) {
	msg := "Internal Server Error"
	// 非生产环境则显示具体错误信息
	if global.App.Config.App.Env == "production" && os.Getenv(gin.EnvGinMode) != gin.ReleaseMode {
		if _, ok := err.(error); ok {
			msg = err.(error).Error()
		}
	}
	// reponse错误
	ctx.JSON(http.StatusInternalServerError, Response{
		http.StatusInternalServerError,
		nil,
		msg,
	})
	ctx.Abort()
}
